package org.lld.im.common.route.algorithm.loop;

import org.lld.im.common.enums.UserErrorCode;
import org.lld.im.common.exception.ApplicationException;
import org.lld.im.common.route.RouteHandler;

import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @author: LunBoWang
 * @description: 轮询模式
 * 轮询模式是一种简单的负载均衡算法，它的原理是按照服务器列表的顺序依次选择一个服务器进行请求处理。
 * 这种算法的优点是实现简单，适用于服务器数量较少的情况。
 * @date: 2025/3/30 下午7:48
 * @version: 1.0
 */

public class LoopHandle implements RouteHandler {

    private AtomicLong index = new AtomicLong();

    @Override
    public String routeServer(List<String> values, String key) {
        int size = values.size();
        if (size == 0) {
            throw new ApplicationException(UserErrorCode.SERVER_NOT_AVAILABLE);
        }
        Long l = index.incrementAndGet() % size;
        if (l < 0) {
            l = 0L;
        }
        return values.get(l.intValue());
    }
}
